#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

/*
函数功能：将字符插入到每行得行首
函数参数：源文件，插入得字符
函数返回值：成功1，失败0
*/
int test(const char* file, char ch);

int main(int argc, const char* argv[])
{
    int num = 0;
    num = test(argv[1], *argv[2]);
    if(num)
    {
        printf("插入成功！\n");
    }
    else
    {
        printf("插入失败！\n");
    }

    return 0;
}

int test(const char* file, char ch)
{
    //源文件
    int fd = 0;
    fd = open(file, O_RDWR);
    if(fd == -1)
    {
        printf("文件打开失败！ \n");
        return 0;
    }

    //临时文件
    int ftmp = 0;
    ftmp = open(".tmp.txt", O_RDWR | O_CREAT, 0777);
    if(ftmp == -1)
    {
        printf("文件打开失败！ \n");
        return 0;
    }

    //遍历源文件
    char tmp = 0;
    int len = 0;
    write(ftmp, &ch, sizeof(char)); // 第一行添加
    while((len = read(fd, &tmp, sizeof(char))) != 0)
    {
        if(len == -1)
        {
            printf("读取失败！\n");
            close(fd);
            return 0;
        }

        write(ftmp, &tmp, sizeof(char)); // 写入临时文件
        if(tmp == '\n')
        {
            write(ftmp, &ch, sizeof(char)); // 添加内容
        }
    }

    lseek(ftmp, 0, SEEK_SET);// 让临时文件off_t到文件开头
    lseek(fd, 0, SEEK_SET);// 让源文件off_t到文件开头
    while((len = read(ftmp, &tmp, sizeof(char))) != 0)
    {
        if(len == -1)
        {
            printf("读取失败！\n");
            close(ftmp);
            return 0;
        }
        write(fd, &tmp, sizeof(char)); // 临时文件覆盖源文件
    }
    //关闭文件
    close(ftmp); 
    close(fd);
    remove(".tmp.txt"); //删除临时文件

    return 1;
}